package com.my.javaweb.mapstream;

import lombok.Data;

import java.util.ArrayList;
import java.util.List;
import java.util.Map;
import java.util.Set;
import java.util.function.Function;
import java.util.stream.Collectors;

/**
 * @author Felix
 * @date 2023/10/14 22:54
 */
public class MapStreamTest {

    @Data
    static class Info {
        Long id;
        String pjId;
        String tpId;
        String name;
        String code;

        public Info(Long id, String pjId, String tpId, String name, String code) {
            this.id = id;
            this.pjId = pjId;
            this.tpId = tpId;
            this.name = name;
            this.code = code;
        }

        public Info() {
        }
    }

    public static void main(String[] args) {
        Info info = new Info(1L, "pjId1", "tpId1", "zs", "high");
        Info info1 = new Info(2L, "pjId1", "tpId1", "ls", "low");
        Info info2 = new Info(3L, "pjId2", "tpId2", "ww", "middle");

        /*info.setId(1L);
        info.setPjId("pjId1");
        info.setTpId("tpId1");
        info.setName("zs");
        info.setCode("high");

        Info info1 = new Info();
        info1.setId(2L);
        info1.setPjId("pjId1");
        info1.setTpId("tpId1");
        info1.setName("ls");
        info1.setCode("high1");

        Info info2 = new Info();
        info2.setId(3L);
        info2.setPjId("pjId2");
        info2.setTpId("tpId1");
        info2.setName("ww");
        info2.setCode("high2");*/

        List<Info> list = new ArrayList<>();
        list.add(info);
        list.add(info1);
        list.add(info2);

//        for (int i = 0; i < list.size(); i++) {
//            System.out.println(list.get(i).getId());
//        }

        /*以id为key value为name*/
//        Map<Long, String> map = list.stream().collect(Collectors.toMap(Info::getId, Info::getName));
//        Set<Map.Entry<Long,String>> entrySet = map.entrySet(); // 获取（key,value）集合
//        System.out.println(entrySet);
//        for(Map.Entry<Long,String> a : entrySet){ // 遍历
//            System.out.println("key:"+a.getKey()+",value:"+a.getValue());
//        }

        /*将list转map 【key为多个属性,value为1个属性】*/
//        Map<String, String> map = list.stream().collect(
//                Collectors.toMap(
//                        o -> o.getPjId() + "-" + o.getName(),
//                        Info::getName,
//                        (key1 , key2) -> key1  /*map的键重复不会报错，底层已经处理，如果不写有重复会报错`Duplicate key`*/
//                        ));
//        Set<Map.Entry<String, String>> entrySet = map.entrySet(); // 获取（key,value）集合
//        System.out.println(entrySet);
//        for (Map.Entry<String, String> a : entrySet) { // 遍历
//            System.out.println("key:" + a.getKey() + ",value:" + a.getValue());
//        }

        /*以id为key Info*/
//        Map<Long, Info> map = list.stream().collect(Collectors.toMap(Info::getId,  Function.identity(), (key1 , key2) -> key1));
//        Set<Map.Entry<Long,Info>> entrySet = map.entrySet(); // 获取（key,value）集合
//        for(Map.Entry<Long,Info> a : entrySet){ // 遍历
//            System.out.println("key:"+a.getKey()+",value:"+a.getValue());
//        }

        /*将list转map 【key为1个属性,value为对象本身】  （map的键去重）*/
//        Map<String, Info> map = list.stream().collect(Collectors.toMap(Info::getPjId,  Function.identity(), (key1 , key2) -> key1));
//        Set<Map.Entry<String,Info>> entrySet = map.entrySet(); // 获取（key,value）集合
//        System.out.println(entrySet);
//        for(Map.Entry<String,Info> a : entrySet){ // 遍历
//            System.out.println("key:"+a.getKey()+",value:"+a.getValue());
//        }

        /*将list转map 【key为1个属性,value为对象本身】*/
//        Map<String, Info> map = list.stream().collect(Collectors.toMap(Info::getPjId, obj -> obj, (key1, key2) -> key1));
//        Set<Map.Entry<String, Info>> entrySet = map.entrySet(); // 获取（key,value）集合
//        System.out.println(entrySet);
//        for (Map.Entry<String, Info> a : entrySet) { // 遍历
//            System.out.println("key:" + a.getKey() + ",value:" + a.getValue());
//        }

        /*将list转map 【key为多个属性,value为对象本身】*/
//        Map<String, Info> map = list.stream().collect(
//                Collectors.toMap(
//                        o -> o.getPjId()+"-"+o.getName(),
//                        obj -> obj,
//                        (key1, key2) -> key1));
//        Set<Map.Entry<String, Info>> entrySet = map.entrySet(); // 获取（key,value）集合
//        System.out.println(entrySet);
//        for (Map.Entry<String, Info> a : entrySet) { // 遍历
//            System.out.println("key:" + a.getKey() + ",value:" + a.getValue());
//        }


        /*指定属性，将list分组转成map*/
//        Map<String, List<Info>> map = list.stream().collect(Collectors.groupingBy(Info::getPjId));
//        Set<Map.Entry<String, List<Info>>> entries = map.entrySet();
//        System.out.println(entries);
//        for (Map.Entry<String, List<Info>> entry : entries) {
//            List<Info> value = entry.getValue();
//            for (Info e : value) {
//                System.out.println(e.getId() + ":" + e.getPjId() + ":" + e.getName());
//            }
//        }


//        listAddEntity();
    }

    static void listAddEntity() {
        List<Info> list = new ArrayList<>();
        for (int i = 0; i < 3; i++) {
            Info info = new Info();
            info.setId((long) i);
            info.setPjId("pjId1");
            info.setTpId("tpId1");
            info.setName("zs");
            info.setCode("high");

            list.add(info);
        }
        for (int i = 0; i < list.size(); i++) {
            System.out.println(list.get(i).getId());
        }
    }
}
